package hg.framework.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HgStringUtils {

    /**
     * 正则匹配-手机号
     */
    private static final String PHONE_REGEXP = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";

    /**
     * @param str 被匹配的字符串
     * @return  是否匹配成功
     */
    public static boolean isPhone(String str){
        if (str == null || str.equals("")) {
            return false;
        }
        Pattern pattern = Pattern.compile(PHONE_REGEXP);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }
    /**
     * 默认读取数据
     * @param obj
     * @return
     */
    public static String val(Object obj) {
        return (null == obj ? "" : obj.toString()).trim();
    }

    /**
     * 判断字符串中是否包含中文
     * @param str
     * 待校验字符串
     * @return 是否为中文
     * @warn 不能校验是否为中文标点符号
     */
    public static boolean isContainChinese(String str) {
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(str);
        if (m.find()) {
            return true;
        }
        return false;
    }

    /**
     * 判断-json串中是否有某个属性值
     * @param resJson json串
     * @param propKey 属性KEY
     * @return true: 存在
     */
    public static boolean exists(String resJson, String propKey) {
        resJson = HgStringUtils.val(resJson);
        propKey = HgStringUtils.val(propKey);
        return (resJson.split(propKey).length > 1);
    }

    /**
     * 判断-json串中某个属性值是否有多个
     * <p>已知存在，是否有多个</p>
     * @param resJson json串
     * @param propKey 属性KEY
     * @return true:多个
     */
    public static boolean isMul(String resJson, String propKey) {
        resJson = HgStringUtils.val(resJson);
        propKey = HgStringUtils.val(propKey);
        return (resJson.split(propKey).length > 2);
    }

    /**
     * 获取json串中，属性值
     * @param resJson json串
     * @param propKey 属性KEY
     * @return
     */
    public static String getVal(String resJson, String propKey) {
        if (!exists(resJson, propKey)) {
            return "";
        }
        String val = resJson.split(propKey)[1];
        return getVal(val);
    }

    /**
     * 获取json串中，某个属性值
     * <p>已知，属性为集合</p>
     * @param resJson json串
     * @param propKey 属性KEY
     * @return
     */
    public static List<String> getValList(String resJson, String propKey) {
        if (!exists(resJson, propKey)) {
            return new ArrayList<>(0);
        }
        resJson = HgStringUtils.val(resJson);
        propKey = HgStringUtils.val(propKey);
        String[] valArr = resJson.split(propKey);
        List<String> valList = new ArrayList<>(valArr.length);
        String itemVal = null;
        for (int i = 1 ; i < valArr.length; i++) {
            itemVal = getVal(valArr[i]);
            valList.add(itemVal);
        }
        return valList;
    }

    /**
     * 获取json串中属性值
     * @param propJson 已通过属性key分隔的子json串
     * @return
     */
    private static String getVal(String propJson) {
        boolean isLastKey = isLastKey(propJson);
        int mIndex = propJson.indexOf(":");
        int lstIndex = -1;
        if (isLastKey) {
            lstIndex = propJson.indexOf("}");
        } else {
            lstIndex = propJson.indexOf(",");
        }
        propJson = propJson.substring(mIndex, lstIndex);
        return propJson.replaceAll("\"", "").replaceAll(":", "");
    }

    /**
     * 判断属性key是否为最后一个元素
     * @param propJson 已通过属性key分隔的子json串
     * @return
     */
    private static boolean isLastKey(String propJson) {
        int indexA = propJson.indexOf(",");
        int indexB = propJson.indexOf("}");
        if (-1 == indexA) {
            // 逗号不存在,最后一个记录，eg:"taskNum":"110"}
            // 出现在单记录
            return true;
        } else if (indexA > indexB){
            // 逗号存在，且，逗号位置大于括号位置，eg:"taskNum":"110"},{
            return true;
        } else {
            // 逗号存在，逗号位置小于括号位置,eg:":"0110","taskNum":"110"}
            return false;
        }
    }
}
